// 联合类型：string | number --> 类型可以是string或number
let a: string | number = 123;
a = "hello";

interface Person {
  name: string;
}

let b: number | Person = 123;
b = { name: "jack" };

let c: number[] | string = [1, 2, 3];
c.forEach(() => {});
// c.substring(0, 2) // 报错

// 输入 123  输出 321
// 输入 '123'  输出 '321'
// const reverse = (x: number | string) => {
// if (typeof x === "string") {
//   return x.split("").reverse().join("");
// } else if (typeof x === "number") {
//   return Number(x.toString().split("").reverse().join(""));
// }
// 类型断言
// (x as string).split("");
// };

// 联合类型，如果想要使用其中的属性或方法，默认只能使用联合类型的公共的属性和方法
interface P1 {
  name: string;
  age: number;
}

interface P2 {
  name: string;
  sex: string;
}

const fn = (p: P1 | P2) => {
  p.name;
  // p.age; // 报错
  // p.sex; // 报错
  (p as P1).age; // 联合类型使用类型断言（as）可以将联合类型当做其中某一个类型去使用
};

// 可以将unknown断言成某个类型去使用（断言的类型没有要求）
let d: unknown = [];
(d as number[]).forEach(() => {});
